import preferences from '@ohos.data.preferences';
import Logger from './Logger';
import CommonConstants from '../constants/CommonConstants';

const TAG: string = 'PreferenceUtil'

/**
 * Preference缓存数据
 */
class PreferenceUtil {
    private pref: preferences.Preferences

    /**
     * 初始化Preference
     * @param context 上下文
     */
    loadPreference(context) {
        try {
            // 加载preferences
            this.pref = preferences.getPreferencesSync(context, { name: CommonConstants.PREFERENCES_NAME })
            Logger.info(TAG, `加载Preferences[${CommonConstants.PREFERENCES_NAME}]成功`)
        } catch (e) {
            Logger.error(TAG, `加载Preferences[${CommonConstants.PREFERENCES_NAME}]失败, ${JSON.stringify(e)}`)
        }
    }

    /**
     * 向Preference里面存值，异步方法
     * @param key 键
     * @param value 值
     */
    async putPreferenceValue(key: string, value: preferences.ValueType) {
        if (!this.pref) {
            Logger.error(TAG, `Preferences[${CommonConstants.PREFERENCES_NAME}]尚未初始化！`)
            return
        }
        try {
            // 写入数据
            this.pref.putSync(key, value)
            // 保存
            await this.pref.flush()
            Logger.info(TAG, `保存Preferences[${key}=${value}]成功`)
        } catch (e) {
            Logger.error(TAG, `保存Preferences[${key}=${value}]失败, ${JSON.stringify(e)}`)
        }
    }

    /**
     * 从Preference里面取值
     * @param key 键
     * @param defaultValue 没有取到值的时候要返回的默认值
     * @returns 返回key对应的值，若没有则返回默认值
     */
    getPreferenceValue(key: string, defaultValue: preferences.ValueType) {
        if (!this.pref) {
            Logger.error(TAG, `Preferences[${CommonConstants.PREFERENCES_NAME}]尚未初始化！`)
            return defaultValue
        }
        try {
            // 读数据
            let value = this.pref.getSync(key, defaultValue)
            Logger.info(TAG, `读取Preferences[${key}=${value}]成功`)
            return value
        } catch (e) {
            Logger.error(TAG, `读取Preferences[${key}]失败, ${JSON.stringify(e)}`)
            return defaultValue
        }
    }
}

export default new PreferenceUtil()
